#include "stringlistmodel.h"

StringListModel::StringListModel(const QStringList& strings, QObject *parent)
    : QAbstractListModel{parent}, stringlist(strings)
{}

int StringListModel::rowCount(const QModelIndex &parent) const
{
    return stringlist.count();
}

// QVariant StringListModel::data(int role, const QModelIndex &index) const
QVariant StringListModel::data(const QModelIndex& index, int role) const
{
    if(index.isValid() == false)
        return QVariant();

    if(index.row() >= stringlist.size())
        return QVariant();

    if(role == Qt::DisplayRole || role == Qt::EditRole){
        return stringlist.at(index.row());
    }else{
        return QVariant();
    }
}

QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role != Qt::DisplayRole){
        return QVariant();
    }

    if(orientation == Qt::Horizontal){
        return QString("Column %1").arg(section);
    }else{
        return QString("Row %1").arg(section);
    }
}

// 设置可编辑选项
Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const
{
    if(!index.isValid()){
        return Qt::ItemIsEnabled;
    }

    return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}

bool StringListModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(index.isValid() && role == Qt::EditRole){
        stringlist.replace(index.row(), value.toString());
        emit dataChanged(index, index);
        return true;
    }
    return false;
}

// 添加行与删除行
bool StringListModel::insertRows(int position, int rows, const QModelIndex& index){
    beginInsertRows(QModelIndex(), position, position + rows - 1);
    for(int row = 0; row < rows; row++){
        stringlist.insert(position, "");
    }
    endInsertRows();
    return true;
}

bool StringListModel::removeRows(int position, int rows, const QModelIndex& index){
    beginRemoveRows(QModelIndex(), position, position + rows - 1);
    for(int row = 0; row < rows; row++){
        stringlist.removeAt(position);
    }
    endRemoveRows();
    return true;
}
